﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<cmath>	
#include<iostream>
using namespace std;
//增高防护塔
/*输入：
第一行输入一个整数n,表示防护塔的数量。
第二行输入n个数，表示每个防护塔的初始高度。
第三行输入一个整数m，表示牛可乐的工作天数。
接下来m行每行三个整数a,b,c，表示给第a个塔到第b个塔增建c的高度。
1 <= n,m <= 100, 1 <= a, b <= n, 1 <= c <= 1000
输出描述:
输出一行，包含n个整数，以空格隔开，表示各个防护塔最终的高度*/
//int main()
//{
//	int n;
//	int m;
//	cin >> n;
//	int f, s, t;
//	int arr[131]={0};
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> arr[i];
//	}
//	cin >> m;
//	for (int i = 1; i <= m; i++)
//	{
//		cin >> f >> s >> t;
//		for (int j = f; j < s + 1; j++)
//		{
//			arr[j] += t;
//		}
//	}
//	for (int i = 1; i <= n; i++)
//	{
//		cout << arr[i]<<" ";
//	}
//	return 0;
//}
//------------------------------------
//字符数量
/* 输入：abc abc def 
abab   ccc
ccc ccc 
输出：a:4
b:4
c:11
d:1
e:1
f:1*/
//int main()
//{
//	char ch;
//	int arr[100001]={0};
//	int i = 0;
//	while ((scanf("%c",&ch) !=EOF))
//	{
//		if (ch >= 'a' && ch <= 'z')
//		{
//			arr[ch]++;
//		}
//	}
//	for (i = 97; i < 123; i++)
//	{
//		if (arr[i] != 0)
//		{
//			printf("%c:%d\n", i, arr[i]);
//		}
//	}
//	return 0;
//}
//--------------------------------------
//质数质量
/*
输入描述:
第一行输入一个整数T，表示询问的个数
接下来T行每行输入一个整数n.
1<=T<=1e8,1<=n<=1000000
输出描述:
对于每个询问n输出小于等于n的的质数的个数。*/
//bool Is_Prime(int n)
//{
//	int i = 2;
//	for (i = 2; i <= sqrt(n); i++)
//	{
//		
//		if (n % i == 0)
//		{
//			return false;
//		}
//	}
//	return true;
//}
//int main()
//{
//	long long T, n;
//	cin >> T;
//	long count = 0;
//	while (T--)
//	{
//		cin >> n;
//		count = 1;
//		if (n <= 1)
//		{
//			continue;
//		}
//		if (n == 2)
//		{
//			cout << 1 << endl;
//		}
//		else
//		{
//			for (int i = 3; i <= n; i += 2)
//			{
//				if (Is_Prime(i))
//				{
//					count++;
//				}
//			}
//			cout << count << endl;
//		}
//	}
//	return 0;
//}
//----------------------------------
//设计一个函数,它能分离整数n从右边第k个数字
//int digit(long n, int k)
//{
//	int count = 0;
//	int ret = 0;
//	while (n)
//	{
//		ret = n % 10;
//		count++;
//		if (count == k)
//		{
//			return ret;
//		}
//		n /= 10;
//	}
//	return 0;
//}
//int main()
//{
//	long n;
//	int k;
//	cin >> n >> k;
//	int ret=digit(n, k);
//	cout << ret << endl;
//	return 0;
//}
//------------------------------------
//最大连号
/*例：输入 1 2 3 4 7 8 10 11
      输出 4   */
//int arr[10010];
//int main()
//{
//    int n = 0;
//    cin >> n;
//    int sum = 1;
//    int max = 1;
//    for (int i = 0; i < n; i++)
//    {
//        cin >> arr[i];
//    }
//    for (int i = 0; i < n; i++)
//    {
//        if (arr[i + 1] == arr[i] + 1)
//        {
//            sum++;
//            if (max < sum)
//            {
//                max = sum;
//            }
//        }
//        else
//        {
//            sum = 1;
//        }
//    }
//    cout << max;
//    return 0;
//}
//------------------------------
//约瑟夫环
//int main()
//{
//    int arr[10010] = { 0 };
//    int count = 1;
//    int number, k;
//    int m = 0;
//    cin >> number>>m >>k;
//    int pos = m-1;
//    int n = number;
//    for (int i = 1; i <= n; i++)
//    {
//        arr[i - 1] = i;
//    }
//    while (number > 1)
//    {
//        if (arr[pos] > 0)
//        {
//            if (count == k)
//            {
//                arr[pos] = 0;
//                count = 1;
//                pos = (++pos) % n;
//                number--;
//            }
//            else
//            {
//                count++;
//                pos = (++pos) % n;
//            }
//        }
//        else
//        {
//            pos = (++pos) % n;
//        }
//    }
//    for (int i = 0; i < n; i++)
//    {
//        if (arr[i] > 0)
//        {
//            cout << arr[i];
//        }
//    }
//    return 0;
//}
//---------------------------------------------
///删除在第一行的n个整数中第一次出现数字m并删除，然后按照顺序输出剩下的数 
//int main()
//{
//    int n, m;
//    cin >> n >> m;
//    int arr[10001]={0};
//    for (int i = 0; i < n; i++)
//    {
//        cin >> arr[i];
//    }
//    for (int i = 0; i < n; i++)
//    {
//        if (arr[i] == m)
//        {
//            //后移
//            for (int j = i ; j < n-1; j++)
//            {
//                arr[i] = arr[i+1];
//            }
//        }
//    }
//    for (int i = 0; i < n - 1; i++)
//    {
//        cout << arr[i] << " ";
//    }
//    return 0;
//}
//---------------------------
//删除在第一行的n个整数中第一次出现数字m并删除，然后按照顺序输出剩下的数 
//int main()
//{
//    int n, m;
//    int i;
//    int k;
//    int arr[100]={0};
//    while (scanf("%d", &n) != EOF)
//    {
//        for ( i = 0; i < n; i++)
//        {
//            cin >> arr[i];
//        }
//        cin >> m;
//        for (i = 0; i < n; i++)
//        {
//            if (arr[i] != m)
//            {
//                cout << arr[i] << " ";
//            }
//            else
//            {
//                break;
//            }
//        }
//        for (k = i + 1; k < n; k++)
//        {
//            cout << arr[k] << " ";
//        }
//        cout << endl;
//    }
//    return 0;
//}
//----------------------------------------
//找出一个数组中出现次数最多的那个元素
//int main()
//{
//    int n = 0;
//    int arr[10001];
//    cin >> n;
//    int sum;
//    for (int i = 0; i < n; i++)
//    {
//        cin >> arr[i];
//    }
//    int max = -100;
//    for (int i = 0; i < n; i++)
//    {
//        for (int j = i + 1; j < n; j++)
//        {
//            sum = 0;
//            if (arr[i] == arr[j])
//            {
//                sum++;
//                if (sum > max)
//                {
//                    max = sum;
//                }
//            }
//        }
//    }
//    cout << max;
//    return 0;
//}
//-------------------------------------------
//找出一个数组中出现次数最多的那个元素
//int main()
//{
//    int n, k, max = -1100;
//    int m;
//    cin >> n;
//    int arr[10011]={0};
//    for (int i = 0; i < n; i++)
//    {
//        cin >> m;
//        arr[m]++;
//        if (max < arr[m])
//        {
//            max = arr[m];
//            k = m;
//        }
//    }
//    cout << k;
//    return 0;
//}
//------------------------------------------------
//给你一个整数n，按要求输出n∗n的回型矩阵
/*例；输入4
输出：
  1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7*/
int main()
{
    int n;
    cin >> n;
    int arr[20][20] = {0};
    int up = 0, down = n - 1, left = 0, right = n - 1;
    int k = 1;
    int i = 0;
    while (k < n * n + 1)
    {/*
        for (i = left; i <= right; i++)
        {
            arr[up][i] = k++;
        }
        for (i = up+1; i <= down; i++)
        {
            arr[i][right] = k++;
        }
        for (i = right-1; i >= left; i--)
        {
            arr[down][i] = k++;
        }
        for (i = down-1; i > up; i--)
        {
            arr[i][down] = k++;
        }*/
        for (i = left; i <= right; i++)
        {
            arr[up][i] = k++;
        }
        for (i = up + 1; i <= down; i++)
        {
            arr[i][right] = k++;
        }
        for (i = right - 1; i >= left; i--)
        {
            arr[down][i] = k++;
        }
        for (i = down - 1; i > up; i--)
        {
            arr[i][left] = k++;
        }
        up++;   
        down--;
        left++;
        right--;
    }
    for (i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%3d ", arr[i][j]);
        }
        cout << endl;
    }
}
